/**
 * @brief AT指令脚本。全部列举设备支持的AT指令，并附加去说明等信息。
 *   脚本使用XML格式保存和编辑.脚本文件格式定义如下：
 *   <?xml version='1.0' encoding='utf-8'?>
 *   <at_scpt version='1.0' count='10'><!-- count是AT指令的数量-->
 *       <item id="0" msg="版本" comment="获取版本" enable="true|false">AT+VER&#x000D&#x000A</item>
 *         …… …… …… …… …… …… …… ……
 *   </at_scpt>
 * @version 0.1
 * @date 2017-9-1
 * @author 宋炜
 */

#ifndef __AT_SCRIPT_HPP__
#define __AT_SCRIPT_HPP__

#include <tinyxml.h>
#include <string>
#include <vector>
#include <functional>

class CATScript
{
public:
	enum err_code{
		ERR_SCRIPT_FILE_XML,
		ERR_XML_NO_ROOT,
		ERR_ROOT_NAME,
		ERR_SCRIPT_VERSION_FORMAT,
		ERR_SCRIPT_COUNT_FORMAT,
		ERR_SCRIPT_VERSION,
		ERR_SCRIPT_ITEM_NULL,
		ERR_SCRIPT_NO_ID,
		ERR_SCRIPT_NO_MSG,
		OK
	};
	struct st_item
	{
		int         id;
		std::string msg;
		std::string comment;
		std::string at;
		bool        enable;

		st_item(){}
		st_item( const st_item& b )
		{
			id = b.id;
			msg = b.msg;
			at = b.at;
			enable = b.enable;
		}
		~st_item(){}

		st_item& operator=( const st_item& b ){id = b.id; msg = b.msg; at = b.at; enable = b.enable; return *this;}
	};

	typedef std::vector< struct st_item >    AtSet_t;
private:
	TiXmlDocument m_doc;
	AtSet_t       m_at_set;
public:
	CATScript( const std::string& file );
	virtual ~CATScript(){}

	void ForEach( std::function<void (const st_item& , bool& )> fun );
};
#endif
